package me.yushuai.wukong.base.api;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.yushuai.wukong.base.api.dto.CreateLocationDTO;
import me.yushuai.wukong.base.api.dto.LocDTO;
import me.yushuai.wukong.base.api.dto.UpdateLocationDTO;
import me.yushuai.wukong.base.api.request.PagingSearchLocationRequest;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.error.WuKongException;
import me.yushuai.wukong.common.exceptin.NotExistException;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 库位管理客户端
 *
 * @author zhoushuai@189.cn
 * @since 2022-08-31
 */
@Component
@Api("库位API")
@FeignClient("${spring.application.name}")
public interface LocApi {

    /**
     * 新建一条库位记录
     *
     * @param dto 新建库位信息
     * @return 返回库位的编号
     * @throws WuKongException 当库位编码已经存在时抛出异常
     */
    @ApiOperation("新建库位")
    @PostMapping("/loc")
    Long createLocation(@Validated @RequestBody CreateLocationDTO dto) throws WuKongException;

    /**
     * 修改库位信息
     *
     * @param id  库位编号
     * @param dto 库位信息
     * @return 返回被修改的库位编号
     * @throws WuKongException 当库位编号不存在时抛出异常
     */
    @ApiOperation("修改库位")
    @PutMapping("/loc/{id}")
    Long editLocation(@PathVariable("id") Long id, @Validated @RequestBody UpdateLocationDTO dto) throws WuKongException;

    /**
     * 删除一条库位信息
     *
     * @param id 库位编号
     * @return 返回库位的编号
     * @throws WuKongException 当库位不存在时抛出异常
     */
    @ApiOperation("删除库位")
    @DeleteMapping("/loc/{id}")
    Long deleteLocation(@PathVariable("id") Long id) throws WuKongException;

    /**
     * 获取库位详细信息
     *
     * @param id 库位编号
     * @return 返回库位详细信息
     * @throws NotExistException 当库位信息不存在时抛出异常
     */
    @ApiOperation("库位详细信息")
    @GetMapping("/loc/{id}")
    LocDTO getById(@PathVariable("id") Long id) throws NotExistException;


    /**
     * 分页条件检索库位信息
     *
     * @param request 分页检索条件
     * @return 分页返回检索结果
     */
    @ApiOperation("分页条件库位信息")
    @PostMapping("/locs")
    PageDTO<LocDTO> pagingSearchLocation(@Validated @RequestBody PagingSearchLocationRequest request);

    /**
     * 检查库位Id是否存在
     *
     * @param locId 库位Id
     * @return 如果库位id存在返回true否则返回false
     */
    @ApiOperation("检查库位Id是否存在")
    @GetMapping(value = "/loc/{id}", params = "action=exist")
    boolean existById(@PathVariable("id") Long locId);
}
